package dao;

import lombok.Data;
import util.PinyinUtil;

import java.io.File;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

// 代表 file_meta 表中的每个字段
@Data
public class FileMeta {
    private int id;
    private String name;
    private String path;
    private boolean isDirectory;
    // 下面两个属性在 Java 代码中可以没有
    // 是通过上面的 name 属性来
    // 可以给下面两个类加上两个 get 方法来获取 pinyin 和 pinyinFirst
//    private String pinyin;
//    private String pinyinFirst;
    private long size;
//    private String sizeText;
    private long lastModified;
//    private String lastModifiedText;

    public FileMeta(String name, String path, boolean isDirectory, long size, long lastModified) {
        this.name = name;
        this.path = path;
        this.isDirectory = isDirectory;
        this.size = size;
        this.lastModified = lastModified;
    }

    public FileMeta(File f) {
        this(f.getName(), f.getParent(), f.isDirectory(), f.length(), f.lastModified());
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            // 看看是不是与自己比较
            return true;
        }
        if (o == null) {
            // 针对 o 为 null 的特殊处理
            return false;
        }
        if (getClass() != o.getClass()) {
            // 比较类型
            return false;
        }
        FileMeta fileMeta = (FileMeta) o;
        return name.equals(fileMeta.name) && path.equals(fileMeta.path) && isDirectory == fileMeta.isDirectory;
    }

    // 当前已经重写了 equals 了, 但是很多 Java 相关的编程规范, 都建议重写 hashCode
    // 因为两个对象如果 equals 为 true, 此时他们的到的 hashCode 也应该是相同的
    // 但是此处代码中, 不写 hashCode 也行, 毕竟不需要放到哈希表里


    public String getPinyin() {
        return PinyinUtil.get(name, true);
    }

    public String getPinyinFirst() {
        return PinyinUtil.get(name, false);
    }

    // 通过这个方法, 把 size 的值进行单位换算, 变成更易读的结果
    public String getSizeText() {
        // 单位主要是:
        //      Byte, KB, MB, GB
        // 主要是看 size 的大小:
        //      如果 size < 1024, 就用 Byte
        //      如果 size >= 1024, 并且 size < 1024 * 1024, 单位使用 MB
        //      如果 size == 1025, 不是 1025MB, 而是 1.001MB


        // 比较 size 和 1024 之间的大小关系
        // 如果 size < 1024, 直接获取到结果..  如果 size >= 1024, 则 /= 1024, 并且升级单位
        double curSize = size;
        String[] units = {"Byte", "KB", "MB", "GB"};
        for (String unit : units) {
            if (size < 1024) {
                return String.format("%.2f" + unit, new BigDecimal(curSize));
            }
            curSize /= 1024;
        }
        // 当单位升级到 GB 还不够用, 还是以 GB 为单位
        return String.format("%.2f GB", new BigDecimal(curSize));
    }

    public String getLastModifiedText() {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return dateFormat.format(lastModified);
    }
}
